package main

import (
	"api_interface/dao"
	"api_interface/entity"
	"encoding/base64"
	"fmt"
	"time"

	"github.com/dgrijalva/jwt-go"
)

// 创建JWT
func createJWT(id string) (string, error) {
	// 创建一个新的 JWT
	token := jwt.New(jwt.SigningMethodHS256)

	// 添加标准声明
	claims := token.Claims.(jwt.MapClaims)
	claims["exp"] = time.Now().Add(time.Hour * 1).Unix() // 过期时间：1小时

	// 添加自定义声明
	claims["id"] = id

	// 签名并获取字符串表示
	var user entity.AccountInfo
	dao.SqlSession.Where("id = ?", id).First(&user)
	decodedKey, _ := base64.StdEncoding.DecodeString(user.Pwdkey)
	tokenString, err := token.SignedString(decodedKey)
	if err != nil {
		return "", err
	}

	return tokenString, nil
}

// 解析JWT
func parseJWT(tokenString string, id string) error {
	// 解析 JWT
	token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
		// 验证签名方法
		if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
			return nil, fmt.Errorf("不支持的签名方法: %v", token.Header["alg"])
		}
		// 从数据库中获取密钥
		var user entity.AccountInfo
		dao.SqlSession.Where("id = ?", id).First(&user)
		fmt.Println(user.Email)
		decodedKey, _ := base64.StdEncoding.DecodeString(user.Pwdkey)
		return decodedKey, nil
	})

	if err != nil {
		return err
	}

	// 验证 token 中的声明
	if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
		fmt.Println("账号id:", claims["id"])
		fmt.Println("过期时间:", claims["exp"])
		return nil
	} else {
		return fmt.Errorf("无效的 token")
	}
}

func main1() {
	//连接数据库
	err := dao.InitMySql()
	if err != nil {
		panic(err)
	}
	//程序退出关闭数据库连接
	defer dao.Close()
	// 创建 JWT
	token, err := createJWT("10")
	if err != nil {
		fmt.Println("创建 JWT 失败:", err)
		return
	}
	fmt.Println("JWT 创建成功:", token)

	// 解析和验证 JWT
	err = parseJWT(token, "10")
	if err != nil {
		fmt.Println("解析 JWT 失败:", err)
		return
	}
	fmt.Println("JWT 解析成功")
}
